package com.cjst.util;
/**
 * 用户数据权限工具类
 * @author 76558
 *
 */

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import com.cjst.pojo.sys.SysDept;
import com.cjst.pojo.sys.SysOffice;
import com.cjst.pojo.sys.SysRole;
import com.cjst.pojo.sys.SysUser;
import com.cjst.sdp.util.SpringContextHolder;
import com.cjst.service.sys.SysDeptService;
import com.cjst.service.sys.SysOfficeService;
import com.cjst.service.sys.SysRoleService;
import com.cjst.service.sys.SysUserService;
import com.cjst.sql.C;
import com.cjst.sql.Method;
import com.cjst.sql.WherePrams;
/**
 * 权限工具类
 * 1.全部
 * 2.本公司及下属公司
 * 3.本公司
 * 4.本部门及下属部门
 * 5.本部门
 * 6.个人
 * @author 76558
 *
 */
public class UserPrincipalUtil {

	
	
	/**
	 * 从容器中取出roleservice
	 * @return
	 */
	private static SysRoleService getRoleService() {
		return SpringContextHolder.getBean(SysRoleService.class);
	}
	/**
	 * 从容器中获取officeService
	 * @return
	 */
	private static SysOfficeService getOfficeService() {
		return SpringContextHolder.getBean(SysOfficeService.class);
	}
	/**
	 * 从容器中获取deptService
	 * @return
	 */
	private static SysDeptService getDeptService() {
		return SpringContextHolder.getBean(SysDeptService.class);
	}
	
	/**
	 * 从容器中获取userService
	 * @return
	 */
	private static SysUserService getUserService() {
		return SpringContextHolder.getBean(SysUserService.class);
	}
	public static String getUserPrincipals2(SysUser sysUser){
		if (null == sysUser) {
        	return "-1";
        }
        //查看角色
        String roleId = sysUser.getRoleId();
        if(StringUtils.isEmpty(roleId)) {
        	return "-1";
        }
        
        //查看角色信息
        SysRole role = getRoleService().get(roleId);
        if(role == null) {
        	return "-1";
        }
        //读取用户的数据权限类型，如果是1，则是全部，不用对数据进行过滤
        String type = role.getDataScope();
        return type;
	}
	/**
	 * 根据传入的用户，检查角色类型
	 * 如果auth :-1,则说明检查过程中参数错误
	 * auth:1,说明角色数据类型为全部
	 * auth:2,需要根据角色ids来查看数据
	 * @return
	 */
	public static Map<String, Object> getUserPrincipals(SysUser sysUser){
		
		Map<String, Object> map = new HashMap<>();
		
		List<String> users = new ArrayList<>();
		if (null == sysUser) {
        	map.put("auth", "-1");
        	return map;
        }
        //查看角色
        String roleId = sysUser.getRoleId();
        if(StringUtils.isEmpty(roleId)) {
        	map.put("auth", "-1");
        	return map;
        }
        
        //查看角色信息
        SysRole role = getRoleService().get(roleId);
        if(role == null) {
        	map.put("auth", "-1");
        	return map;
        }
        //读取用户的数据权限类型，如果是1，则是全部，不用对数据进行过滤
        String type = role.getDataScope();
        if(StringUtils.isEmpty(type)){
        	map.put("auth", "-1");
        	return map;
        }
        
        if("1".equals(type)) {
        	map.put("auth", "1");
        	return map;
        	
        }else {
        	if("6".equals(type)) {  //个人
        		users.add(sysUser.getId());
        	}else if("5".equals(type)) {         //本部门
        		String deptId =  sysUser.getDeptId();
        		if(StringUtils.isEmpty(deptId)) {
        			map.put("auth", "-1");
                	return map;
        		}
        		WherePrams prams = Method.where("status", C.EQ, "1");
        		prams.and("deptId", C.EQ, deptId);
        		List<SysUser> deptUsers = getUserService().list(prams);
        		if(deptUsers!=null&&deptUsers.size()>0) {
        			for (SysUser user : deptUsers) {
						users.add(user.getId());
					}
        		}
        	}else if("4".equals(type)) {         //本部门及下属部门
        		String deptId =  sysUser.getDeptId();
        		if(StringUtils.isEmpty(deptId)) {
        			map.put("auth", "-1");
                	return map;
        		}
        		//获取部门及下属部门id列表
        		List<String> depts = new ArrayList<>();
        		WherePrams prams = Method.where("status", C.EQ, "1");
        		prams.ands("id", C.EQ, deptId,1);
        		prams.ands("pids", C.LIKE, sysUser.getDeptId(),1);
        		List<SysDept> depLst = getDeptService().list(prams);
        		for (SysDept dept : depLst) {
					depts.add(dept.getId());
				}
        		if(depts==null||depts.size()==0) {
        			map.put("auth", "-1");
                	return map;
        		}
        		WherePrams prams2 = Method.where("status", C.EQ, "1");
        		prams2.andIn("deptId", C.IN, depts);
        		
        		List<SysUser> deptUsers = getUserService().list(prams2);
        		if(deptUsers!=null&&deptUsers.size()>0) {
        			for (SysUser user : deptUsers) {
						users.add(user.getId());
					}
        		}
        	}else if("3".equals(type)) {         //本公司
        		String officeId = sysUser.getOfficeId();
        		if(StringUtils.isEmpty(officeId)) {
        			map.put("auth", "-1");
                	return map;
        		}
        		WherePrams prams = Method.where("status", C.EQ, "1");
        		prams.and("officeId", C.EQ, officeId);
        		List<SysUser> deptUsers = getUserService().list(prams);
        		if(deptUsers!=null&&deptUsers.size()>0) {
        			for (SysUser user : deptUsers) {
						users.add(user.getId());
					}
        		}
        	}else if("2".equals(type)) {         //本公司及下属公司
        		String officeId = sysUser.getOfficeId();
        		if(StringUtils.isEmpty(officeId)) {
        			map.put("auth", "-1");
                	return map;
        		}
        		//获取公司及下属公司id列表
        		List<String> offices = new ArrayList<>();
        		WherePrams prams = Method.where("status", C.EQ, "1");
        		prams.ands("id", C.EQ, officeId,1);
        		prams.ands("parentIds", C.LIKE, officeId,1);
        		List<SysOffice> offLst = getOfficeService().list(prams);
        		for (SysOffice sysOffice : offLst) {
					offices.add(sysOffice.getId());
				}
        		if(offices==null||offices.size()==0) {
        			map.put("auth", "-1");
                	return map;
        		}
        		WherePrams prams2 = Method.where("status", C.EQ, "1");
        		prams2.andIn("officeId", C.IN, offices);       		
        		List<SysUser> deptUsers = getUserService().list(prams2);
        		if(deptUsers!=null&&deptUsers.size()>0) {
        			for (SysUser user : deptUsers) {
						users.add(user.getId());
					}
        		}
        	}
        	map.put("auth", 2);
        	map.put("users", users);
        }
        
        return map;
	}
	
	/**
	 * 获取公司数据权限，
	 * 根据用户情况，可将权限分为以下几类
	 * 1.全部
	 * 2.本公司
	 * 3.公司及以下公司
	 * @param sysUser
	 * @return
	 */
	public static Map<String, Object> getOfficePrincipals(SysUser sysUser){
		
		Map<String, Object> map = new HashMap<>();
		
		List<String> offices = new ArrayList<>();
		if (null == sysUser) {
        	map.put("auth", "-1");
        	return map;
        }
        //查看角色
        String roleId = sysUser.getRoleId();
        if(StringUtils.isEmpty(roleId)) {
        	map.put("auth", "-1");
        	return map;
        }
        
        //查看角色信息
        SysRole role = getRoleService().get(roleId);
        if(role == null) {
        	map.put("auth", "-1");
        	return map;
        }
        //读取用户的数据权限类型，如果是1，则是全部，不用对数据进行过滤
        String type = role.getDataScope();
        if(StringUtils.isEmpty(type)){
        	map.put("auth", "-1");
        	return map;
        }
        
        if("1".equals(type)) {
        	map.put("auth", "1");
        	return map;
        	
        }else {
        	if("2".equals(type)) { //本公司及下属公司
        		WherePrams prams = Method.where("status", C.EQ, "1");
        		prams.ands("id", C.EQ, sysUser.getOfficeId(),1);
        		prams.ands("parentIds", C.LIKE, sysUser.getOfficeId(),1);
        		List<SysOffice> offLst = getOfficeService().list(prams);
        		for (SysOffice sysOffice : offLst) {
					offices.add(sysOffice.getId());
				}
        	}else {  //其他只能展示用户当前所属的公司下的公司
        		offices.add(sysUser.getOfficeId());
        	}
        	map.put("auth", 2);
        	map.put("list", offices);
        }
        
        return map;
	}
	
	/**
	 * 获取部门数据权限
	 * 1.全部，公司及下属公司，本公司可以看到所有的部门，（会根据公司权限进行一点的过滤）
	 * 2.部门及下属部门
	 * 3.本部门及个人都只能看到本部门
	 * @param sysUser
	 * @return
	 */
	public static Map<String, Object> getDeptPrincipals(SysUser sysUser){
		
		Map<String, Object> map = new HashMap<>();
		
		List<String> depts = new ArrayList<>();
		if (null == sysUser) {
        	map.put("auth", "-1");
        	return map;
        }
        //查看角色
        String roleId = sysUser.getRoleId();
        if(StringUtils.isEmpty(roleId)) {
        	map.put("auth", "-1");
        	return map;
        }
        
        //查看角色信息
        SysRole role = getRoleService().get(roleId);
        if(role == null) {
        	map.put("auth", "-1");
        	return map;
        }
        //读取用户的数据权限类型，如果是1，则是全部，不用对数据进行过滤
        String type = role.getDataScope();
        if(StringUtils.isEmpty(type)){
        	map.put("auth", "-1");
        	return map;
        }
        
        if("1".equals(type)||"2".equals(type)||"3".equals(type)) {
        	map.put("auth", "1");
        	return map;
        	
        }else {
        	if("4".equals(type)) { //本部门及下属部门
        		WherePrams prams = Method.where("status", C.EQ, "1");
        		prams.ands("id", C.EQ, sysUser.getDeptId(),1);
        		prams.ands("pids", C.LIKE, sysUser.getDeptId(),1);
        		List<SysDept> depLst = getDeptService().list(prams);
        		for (SysDept dept : depLst) {
					depts.add(dept.getId());
				}
        	}else {  
        		depts.add(sysUser.getDeptId());
        	}
        	map.put("auth", 2);
        	map.put("list", depts);
        }
        
        return map;
	}
	
	
}
